Red Hat System Administration II 8.2

Глава 1. Повышение производительности командной строки

Аннотация

Цель Более эффективный запуск команд за счет использования расширенных функций командной оболочки Bash, сценариев оболочки и различных утилит, доступных в Red Hat Enterprise Linux
Задачи
  • Автоматизация последовательностей команд с помощью простого сценария командной оболочки

  • Эффективное выполнение команд со списками элементов в сценарии или из командной строки с использованием циклов for и условных выражений

  • Поиск текста, соответствующего шаблону, в log-файлах и выводе команды с помощью команды grep и регулярных выражений

Разделы
  • Написание простых сценариев Bash (и упражнение)

  • Более эффективное выполнение команд с помощью циклов (и упражнение)

  • Сопоставление текста в выводе команды с регулярными выражениями (и упражнение)

Лабораторная работа

Повышение производительности командной строки

Написание простых сценариев Bash

Задачи

После завершения этого раздела вы сможете автоматизировать последовательности команд с помощью простого сценария командной оболочки.

Создание и выполнение сценариев командной оболочки Bash

Многие распространенные простые задачи системного администрирования выполняются с использованием утилит командной строки. Для более сложных задач часто требуется последовательно выполнить несколько команд с передачей результатов между ними. Используя среду командной оболочки Bash и функции сценариев, можно объединять команды Linux в сценарии командной оболочки для быстрого решения повторяющихся и сложных задач.

В простейшей форме сценарий командной оболочки Bash — это исполняемый файл со списком команд и, возможно, логикой программирования для управления принятием решений по общей задаче. Хорошо составленный сценарий ― это эффективная утилита командной строки, которая может использоваться другими сценариями.

Создание сценариев командной оболочки — очень важный навык для успешного системного администрирования в любой операционной среде. Практический опыт написания сценариев особенно важен в корпоративных средах, где сценарии могут повысить эффективность и точность выполнения рутинных задач.

Чтобы создать сценарий Bash, откройте пустой файл в текстовом редакторе. Хотя подойдет любой редактор, такие продвинутые редакторы, как vim и emacs, понимают синтаксис сценариев Bash и могут выделять команды цветом. Выделение цветом помогает идентифицировать такие распространенные ошибки, как неправильный синтаксис, непарные кавычки, незакрытые круглые, фигурные и квадратные скобки.

Указание интерпретатора команд

Первая строка сценария начинается с нотации #!, которая также известна как sh-bang или she-bang (по названиям этих двух символов ― sharp и bang). Эта двухбайтная нотация (магическое число), указывает на интерпретируемый сценарий. Синтаксис, идущий за этой нотацией, ― это полностью определенное имя файла интерпретатора команд, который требуется для обработки строк сценария. Чтобы понять, как указывать типы файлов в Linux с помощью магических чисел, см. man-страницы file(1) и magic(5) . В файлах сценариев, в которых используется синтаксис сценариев Bash, первая строка начинается следующим образом:

#!/bin/bash

Выполнение сценария командной оболочки Bash

Готовый сценарий командной оболочки должен быть исполняемым, чтобы запускаться как обычная команда. Используйте команду chmod, чтобы добавить разрешение на выполнение. Вместе с ней можно использовать команду chown для смены владельца файла сценария. Предоставляйте разрешение на выполнение только предполагаемым пользователям сценария.

Если поместить сценарий в один из каталогов, указанных в переменной среды PATH оболочки, можно будет вызывать сценарий оболочки по имени файла, как и любую другую команду. Оболочка использует первую найденную команду с этим именем файла. Старайтесь не использовать существующие имена команд в качестве имени файла сценария оболочки. Кроме того, для вызова сценария оболочки можно ввести путь к сценарию в командной строке. Команда which, за которой идет имя файла исполняемого сценария, отображает путь к выполняемой команде.

[user@host ~]$ which hello
~/bin/hello
[user@host ~]$ echo $PATH
/home/user/.local/bin:/home/user/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

Заключение специальных символов в кавычки

Некоторые символы и слова имеют специальное значение в командной оболочке Bash. Однако иногда требуется использовать эти символы буквально, без специальных значений. Для этого используйте один из следующих трех инструментов, чтобы убрать специальное значение (экранировать символ): обратная косая черта (\), одинарные кавычки ('') или двойные кавычки ("").

Escape-символ обратной косой черты убирает специальное значение одного последующего символа. Например, чтобы отобразить строку # не комментарий с помощью команды echo, символ # не должен интерпретироваться оболочкой Bash специальным образом. Поставьте обратную косую черту перед знаком #.

[user@host ~]$ echo # not a comment

[user@host ~]$ echo \# not a comment
# not a comment

Если необходимо экранировать несколько символов в текстовой строке, используйте escape-символ несколько раз или примените одинарные кавычки (''). Одинарные кавычки сохраняют буквальные значения всех символов, которые в них заключены. Ниже приведен пример использования escape-символа и одинарных кавычек.

[user@host ~]$ echo # not a comment #

[user@host ~]$ echo \# not a comment #
# not a comment
[user@host ~]$ echo \# not a comment \#
# not a comment #
[user@host ~]$ echo '# not a comment #'
# not a comment #

Двойные кавычки подавляют подстановку имен и развертывание командной оболочки, но допускают подстановку команд и переменных. Подстановка переменных концептуально аналогична подстановке команд, но позволяет использовать необязательный синтаксис фигурных скобок. Ниже приведены примеры использования различных видов кавычек.

Используйте одинарные кавычки, чтобы весь текст интерпретировался буквально. Помимо подавления подстановки имен и развертывания командной оболочки, кавычки служат для командной оболочки указанием, что нужно дополнительно подавить подстановку команд и переменных. Вопросительный знак (?) также является метасимволом, который требует защиты от развертывания.

[user@host ~]$ var=$(hostname -s); echo $var
host
[user@host ~]$ echo "***** hostname is ${var} *****"
***** hostname is host *****
[user@host ~]$ echo Your username variable is \$USER.
Your username variable is $USER.
[user@host ~]$ echo "Will variable $var evaluate to $(hostname -s)?"
Will variable host evaluate to host?
[user@host ~]$ echo 'Will variable $var evaluate to $(hostname -s)?'
Will variable $var evaluate to $(hostname -s)?
[user@host ~]$ echo "\"Hello, world\""
"Hello, world"
[user@host ~]$ echo '"Hello, world"'
"Hello, world"

Отображение вывода сценария командной оболочки

Команда echo отображает произвольный текст, для чего необходимо передать этот текст в команду в виде аргумента. По умолчанию текст отображается в стандартном потоке вывода (STDOUT), но его также можно направить в стандартный поток ошибок (STDERR). В следующем простом сценарии Bash команда echo отображает сообщение "Hello, world" в стандартном потоке вывода.

[user@host ~]$ cat ~/bin/hello
#!/bin/bash

echo "Hello, world"

[user@host ~]$ hello
Hello, world

Примечание

Этот пользователь может просто ввести hello в командной строке, поскольку каталог ~/bin (/home/user/bin) находится в пользовательской переменной PATH и сценарий hello в нем является исполняемым. Командная оболочка автоматически находит там сценарий, если в любом из каталогов, указанных до /home/user/bin в переменной PATH, нет другого исполняемого файла с именем hello.

Команда echo широко применяется в сценариях оболочки для отображения информационных сообщений или сообщений об ошибках. Эти сообщения могут быть полезны для определения статуса выполнения сценария, и их можно направить в стандартный поток вывода или стандартный поток ошибок либо в log-файл для архивации. В случае отображения сообщений об ошибках рекомендуется направлять их в стандартный поток ошибок, чтобы было проще отличить сообщения об ошибках от обычных сообщений о состоянии.

[user@host ~]$ cat ~/bin/hello
#!/bin/bash

echo "Hello, world"
echo "ERROR: Houston, we have a problem." >&2

[user@host ~]$ hello 2> hello.log
Hello, world
[user@host ~]$ cat hello.log
ERROR: Houston, we have a problem.

Команда echo также может быть полезна при отладке неработающего сценария командной оболочки. Добавление инструкций echo в ту часть сценария, которая работает неправильно, поможет выяснить, какие команды выполняются, а также значения используемых переменных.

Ссылки

Man-страницы bash(1), magic(5), echo(1) и echo(1p)